+int warm_do_section(void *virt_addr, unsigned long phys_addr,
+ unsigned long size, int cb, int is_unmap)
+{
+ struct warm_map_op mop;
+ unsigned long vaddr;
+ int ret;
+
+ if (warm_fd < 0)
+ return -1;
+
+ vaddr = (unsigned long)virt_addr;
+ if (vaddr & 0xfffff) {
+ fprintf(stderr, PFX "virt_addr is unaligned\n");
+ return -1;
+ }
+ if (phys_addr & 0xfffff) {
+ fprintf(stderr, PFX "phys_addr is unaligned\n");
+ return -1;
+ }
+
+ mop.virt_addr = vaddr;
+ mop.phys_addr = phys_addr;
+ mop.size = size;
+ mop.cb = cb;
+ mop.is_unmap = is_unmap;
+
+ ret = ioctl(warm_fd, WARMC_MMAP, &mop);
+ if (ret != 0) {
+ perror(PFX "WARMC_MMAP failed");
+ return -1;
+ }
+
+ return 0;
+}
+
+int warm_mmap_section(void *virt_addr, unsigned long phys_addr,
+ unsigned long size, int cb)
+{
+ return warm_do_section(virt_addr, phys_addr, size, cb, 0);
+}
+
+int warm_munmap_section(void *virt_addr, unsigned long size)
+{
+ return warm_do_section(virt_addr, 0, size, 0, 1);
+}