|
@@ -377,6 +377,37 @@ void radeon_doorbell_free(struct radeon_device *rdev, u32 doorbell)
|
|
|
__clear_bit(doorbell, rdev->doorbell.used);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * radeon_doorbell_get_kfd_info - Report doorbell configuration required to
|
|
|
+ * setup KFD
|
|
|
+ *
|
|
|
+ * @rdev: radeon_device pointer
|
|
|
+ * @aperture_base: output returning doorbell aperture base physical address
|
|
|
+ * @aperture_size: output returning doorbell aperture size in bytes
|
|
|
+ * @start_offset: output returning # of doorbell bytes reserved for radeon.
|
|
|
+ *
|
|
|
+ * Radeon and the KFD share the doorbell aperture. Radeon sets it up,
|
|
|
+ * takes doorbells required for its own rings and reports the setup to KFD.
|
|
|
+ * Radeon reserved doorbells are at the start of the doorbell aperture.
|
|
|
+ */
|
|
|
+void radeon_doorbell_get_kfd_info(struct radeon_device *rdev,
|
|
|
+ phys_addr_t *aperture_base,
|
|
|
+ size_t *aperture_size,
|
|
|
+ size_t *start_offset)
|
|
|
+{
|
|
|
+ /* The first num_doorbells are used by radeon.
|
|
|
+ * KFD takes whatever's left in the aperture. */
|
|
|
+ if (rdev->doorbell.size > rdev->doorbell.num_doorbells * sizeof(u32)) {
|
|
|
+ *aperture_base = rdev->doorbell.base;
|
|
|
+ *aperture_size = rdev->doorbell.size;
|
|
|
+ *start_offset = rdev->doorbell.num_doorbells * sizeof(u32);
|
|
|
+ } else {
|
|
|
+ *aperture_base = 0;
|
|
|
+ *aperture_size = 0;
|
|
|
+ *start_offset = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* radeon_wb_*()
|
|
|
* Writeback is the the method by which the the GPU updates special pages
|