|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: * ! 25: */ ! 26: ! 27: #include <platforms.h> ! 28: ! 29: #include <ppc/proc_reg.h> /* For isync */ ! 30: #include <mach_debug.h> ! 31: #include <kern/assert.h> ! 32: #include <kern/cpu_number.h> ! 33: #include <kern/spl.h> ! 34: #include <mach/mach_types.h> ! 35: #include <types.h> ! 36: #include <pexpert/ppc/powermac.h> ! 37: #include <ppc/io_map_entries.h> ! 38: #include <pexpert/ppc/dbdma.h> ! 39: ! 40: ! 41: static int dbdma_alloc_index = 0; ! 42: dbdma_command_t *dbdma_alloc_commands = NULL; ! 43: ! 44: void ! 45: dbdma_start(dbdma_regmap_t *dmap, dbdma_command_t *commands) ! 46: { ! 47: unsigned long addr = kvtophys((vm_offset_t) commands); ! 48: ! 49: if (addr & 0xf) ! 50: panic("dbdma_start command structure not 16-byte aligned"); ! 51: ! 52: dmap->d_intselect = 0xff; /* Endian magic - clear out interrupts */ ! 53: DBDMA_ST4_ENDIAN(&dmap->d_control, ! 54: DBDMA_CLEAR_CNTRL( (DBDMA_CNTRL_ACTIVE | ! 55: DBDMA_CNTRL_DEAD | ! 56: DBDMA_CNTRL_WAKE | ! 57: DBDMA_CNTRL_FLUSH | ! 58: DBDMA_CNTRL_PAUSE | ! 59: DBDMA_CNTRL_RUN ))); ! 60: eieio(); ! 61: ! 62: while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_ACTIVE) ! 63: eieio(); ! 64: ! 65: dmap->d_cmdptrhi = 0; eieio();/* 64-bit not yet */ ! 66: DBDMA_ST4_ENDIAN(&dmap->d_cmdptrlo, addr); eieio(); ! 67: ! 68: DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_SET_CNTRL(DBDMA_CNTRL_RUN)); ! 69: eieio(); ! 70: ! 71: } ! 72: ! 73: void ! 74: dbdma_stop(dbdma_regmap_t *dmap) ! 75: { ! 76: DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_CLEAR_CNTRL(DBDMA_CNTRL_RUN) | ! 77: DBDMA_SET_CNTRL(DBDMA_CNTRL_FLUSH)); eieio(); ! 78: ! 79: while (DBDMA_LD4_ENDIAN(&dmap->d_status) & (DBDMA_CNTRL_ACTIVE|DBDMA_CNTRL_FLUSH)) ! 80: eieio(); ! 81: } ! 82: ! 83: void ! 84: dbdma_flush(dbdma_regmap_t *dmap) ! 85: { ! 86: DBDMA_ST4_ENDIAN(&dmap->d_control,DBDMA_SET_CNTRL(DBDMA_CNTRL_FLUSH)); ! 87: eieio(); ! 88: ! 89: while (DBDMA_LD4_ENDIAN(&dmap->d_status) & (DBDMA_CNTRL_FLUSH)) ! 90: eieio(); ! 91: } ! 92: ! 93: void ! 94: dbdma_reset(dbdma_regmap_t *dmap) ! 95: { ! 96: DBDMA_ST4_ENDIAN(&dmap->d_control, ! 97: DBDMA_CLEAR_CNTRL( (DBDMA_CNTRL_ACTIVE | ! 98: DBDMA_CNTRL_DEAD | ! 99: DBDMA_CNTRL_WAKE | ! 100: DBDMA_CNTRL_FLUSH | ! 101: DBDMA_CNTRL_PAUSE | ! 102: DBDMA_CNTRL_RUN ))); ! 103: eieio(); ! 104: ! 105: while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_RUN) ! 106: eieio(); ! 107: } ! 108: ! 109: void ! 110: dbdma_continue(dbdma_regmap_t *dmap) ! 111: { ! 112: DBDMA_ST4_ENDIAN(&dmap->d_control, DBDMA_SET_CNTRL(DBDMA_CNTRL_RUN|DBDMA_CNTRL_WAKE) | DBDMA_CLEAR_CNTRL(DBDMA_CNTRL_PAUSE|DBDMA_CNTRL_DEAD)); ! 113: eieio(); ! 114: } ! 115: ! 116: void ! 117: dbdma_pause(dbdma_regmap_t *dmap) ! 118: { ! 119: DBDMA_ST4_ENDIAN(&dmap->d_control,DBDMA_SET_CNTRL(DBDMA_CNTRL_PAUSE)); ! 120: eieio(); ! 121: ! 122: while (DBDMA_LD4_ENDIAN(&dmap->d_status) & DBDMA_CNTRL_ACTIVE) ! 123: eieio(); ! 124: } ! 125: ! 126: dbdma_command_t * ! 127: dbdma_alloc(int count) ! 128: { ! 129: dbdma_command_t *dbdmap; ! 130: ! 131: /* ! 132: * For now, we assume that dbdma_alloc() is called only when ! 133: * the system is bootstrapping, i.e. before the other CPUs ! 134: * are activated... ! 135: * If that's not the case, we need to protect the global ! 136: * variables here. ! 137: */ ! 138: assert(cpu_number() == master_cpu); ! 139: ! 140: if (dbdma_alloc_index == 0) ! 141: dbdma_alloc_commands = (dbdma_command_t *) io_map(0, PAGE_SIZE); ! 142: if ((dbdma_alloc_index+count) >= PAGE_SIZE / sizeof(dbdma_command_t)) ! 143: panic("Too many dbdma command structures!"); ! 144: ! 145: dbdmap = &dbdma_alloc_commands[dbdma_alloc_index]; ! 146: dbdma_alloc_index += count; ! 147: return dbdmap; ! 148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.