iomem and ioports

Rajat Jain rajatjain at juniper.net
Wed Feb 16 06:43:33 EST 2011


Hi,

This code says that there are 0x10000 possible ioports i.e. in the range (0 - 0xFFFF). To map these into iomemory, simply an address = (0x10000 + ioport num) is used. Thus this code:

>
> if (port > PIO_MASK) return NULL;
>
Checks that the ioport number is within the range of ioports.

> 
> return (void __iomem *) (unsigned long) (port + PIO_OFFSET);
>
And if yes, offsets it by 0x10000 and returns the resulting address that shall be used as iomemory.

Thanks,

Rajat Jain

________________________________________
From: kernelnewbies-bounces at kernelnewbies.org [mailto:kernelnewbies-bounces at kernelnewbies.org] On Behalf Of prabhu
Sent: Wednesday, February 16, 2011 1:15 PM
To: kernelnewbies
Subject: iomem and ioports

HI All,

I started to understand output of /proc/oiports and /proc/iomem. I confused to relate these two's output.  

Below is the kernel source for Mapping of io-port to io-mem. Could anyone please explain below code.

/* We encode the physical PIO addresses (0-0xffff) into the
                                           (0-
 * pointer by offsetting them with a constant (0x10000) and
 * assuming that all the low addresses are always PIO. That means
                                                            means
 * we can do some sanity checks on the low bits, and don't
 * need to just take things for granted.
 */
#define PIO_OFFSET              0x10000UL
#define PIO_MASK                0x0ffffUL
#define PIO_RESERVED            0x40000UL
void __iomem *ioport_map(unsigned long port, unsigned int nr) {
     __iomem
           if (port > PIO_MASK) return NULL;
           return (void __iomem *) (unsigned long) (port + PIO_OFFSET);
                        __iomem
}

Thanks,
Prabhu



More information about the Kernelnewbies mailing list