-----Original Message----- From: Arjan van de Ven [mailto:arjan@xxxxxxxxxxxxx] Sent: Sunday, May 28, 2006 3:51 PM To: Muneeswaran P - TLS, Chennai Cc: kernelnewbies@xxxxxxxxxxxx Subject: RE: kernel memory allocation - please help me On Sun, 2006-05-28 at 14:38 +0530, Muneeswaran P - TLS, Chennai wrote: > > -----Original Message----- > From: Arjan van de Ven [mailto:arjan@xxxxxxxxxxxxx] > Sent: Saturday, May 27, 2006 6:58 PM > To: Muneeswaran P - TLS, Chennai > Cc: kernelnewbies@xxxxxxxxxxxx > Subject: Re: kernel memory allocation - please help me > > > On Sat, 2006-05-27 at 17:13 +0530, Muneeswaran P - TLS, Chennai wrote: > > Hi, > > > > Pls help me. > > > > I am writing device driver (kernel 2.6 ) for PCI-X card. > > > > Pls clarify the following doubts: > > 1. DPRAM is memory mapped to PCI-X card. BAR-0 is mapped to DPRAM. > > 2. I have to transfer data from main memory to DPRAM using bus > > master concept. > > > > 3. I have allocated main memory using kmalloc() call. How to make > > this main memory area as non-cacheable one ? > > why would it have to be uncachable? > > Processors keep copies of recently accessed memory areas in a fast, local > cache; > without this cache, reasonable performance is not possible. If the device > changes an > area of main memory, it is imperative that any processor caches covering > that area be > invalidated; otherwise the processor may work with an incorrect image of > main memory, > and data corruption results. I understand that; there are 2 basic designs here 1) the CPU sniffs the bus and invalidates automatically (this is done on x86 for example) 2) the OS has to do it > Similarly, when the device reads data > from main memory, any changes to that memory residing in processor caches > must be > flushed out first. In Linux, if you use the DMA API correctly (pci_map_* etc) then this flushing is done for you automatically. Either by the API, or by the cpu in case of a dma cache coherent CPU such as x86. This is why you need to use the API, it takes care of this for you. I am using AMD athlon processor. Basically, i allocated memory using kmalloc(). Then pci_map_single() call to map that memory. After bus master data transfer, i used pci_unmap_single() call. If it is processor specific, then it will be a problem right. Is it correct ? DISCLAIMER The contents of this e-mail and any attachment(s) are confidential and intended for the named recipient(s) only. It shall not attach any liability on the originator or HCL or its affiliates. Any views or opinions presented in this email are solely those of the author and may not necessarily reflect the opinions of HCL or its affiliates. Any form of reproduction, dissemination, copying, disclosure, modification, distribution and / or publication of this message without the prior written consent of the author of this e-mail is strictly prohibited. If you have received this email in error please delete it and notify the sender immediately. Before opening any mail and attachments please check them for viruses and defect. -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/